package main

import (
    "fmt"
    "os"
    "os/exec"
    "path/filepath"
    "strings"
)

func main() {
    // 检查命令行参数
    args := os.Args[1:]
    if len(args) > 0 {
        switch args[0] {
        case "add-plugin":
            if len(args) < 2 {
                fmt.Println("Usage: app add-plugin <plugin-file>")
                os.Exit(1)
            }
            if err := addPlugin(args[1]); err != nil {
                fmt.Printf("Failed to add plugin: %v\n", err)
                os.Exit(1)
            }
            fmt.Printf("Plugin %s added successfully\n", args[1])
            return
        case "remove-plugin":
            if len(args) < 2 {
                fmt.Println("Usage: app remove-plugin <plugin-name>")
                os.Exit(1)
            }
            if err := removePlugin(args[1]); err != nil {
                fmt.Printf("Failed to remove plugin: %v\n", err)
                os.Exit(1)
            }
            fmt.Printf("Plugin %s removed successfully\n", args[1])
            return
        case "list-plugins":
            if err := listPlugins(); err != nil {
                fmt.Printf("Failed to list plugins: %v\n", err)
                os.Exit(1)
            }
            return
        }
    }
    
    fmt.Println("XJar Plus Application Launcher")
    
    // 获取当前可执行文件的目录
    exePath, _ := os.Executable()
    exeDir := filepath.Dir(exePath)
    
    // 检查app.x是否存在
    appPath := filepath.Join(exeDir, "app.x")
    if _, err := os.Stat(appPath); os.IsNotExist(err) {
        fmt.Printf("Error: app.x not found at %s\n", appPath)
        os.Exit(1)
    }
    
    // 提取插件
    pluginDir := filepath.Join(exeDir, "plugins")
    if err := extractPlugins(pluginDir); err != nil {
        fmt.Printf("Warning: Failed to extract plugins: %v\n", err)
    }
    
    // 简单运行Java命令
    argsStr := "-jar " + appPath
    cmdArgs := strings.Fields(argsStr)
    cmd := exec.Command("java", cmdArgs...)
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

    fmt.Println("Starting application...")
    if err := cmd.Run(); err != nil {
        fmt.Printf("Error running application: %v\n", err)
        os.Exit(1)
    }
}

// addPlugin 添加插件
func addPlugin(pluginFile string) error {
    // 获取可执行文件所在目录
    exeDir := filepath.Dir(os.Args[0])
    pluginsDir := filepath.Join(exeDir, "plugins")

    // 创建插件目录（如果不存在）
    if err := os.MkdirAll(pluginsDir, os.ModePerm); err != nil {
        return fmt.Errorf("failed to create plugins directory: %v", err)
    }

    // 检查插件文件是否存在
    if _, err := os.Stat(pluginFile); os.IsNotExist(err) {
        return fmt.Errorf("plugin file does not exist: %s", pluginFile)
    }

    // 获取插件文件名
    pluginName := filepath.Base(pluginFile)

    // 检查是否为.x文件
    if filepath.Ext(pluginName) != ".x" {
        return fmt.Errorf("plugin file must have .x extension")
    }

    // 复制插件文件到插件目录
    pluginPath := filepath.Join(pluginsDir, pluginName)

    // 读取插件文件
    data, err := os.ReadFile(pluginFile)
    if err != nil {
        return fmt.Errorf("failed to read plugin file: %v", err)
    }

    // 写入插件文件
    if err := os.WriteFile(pluginPath, data, os.ModePerm); err != nil {
        return fmt.Errorf("failed to write plugin file: %v", err)
    }

    return nil
}

// removePlugin 移除插件
func removePlugin(pluginName string) error {
    // 获取可执行文件所在目录
    exeDir := filepath.Dir(os.Args[0])
    pluginsDir := filepath.Join(exeDir, "plugins")

    // 构建插件文件路径
    pluginPath := filepath.Join(pluginsDir, pluginName)

    // 检查插件文件是否存在
    if _, err := os.Stat(pluginPath); os.IsNotExist(err) {
        return fmt.Errorf("plugin does not exist: %s", pluginName)
    }

    // 删除插件文件
    if err := os.Remove(pluginPath); err != nil {
        return fmt.Errorf("failed to remove plugin: %v", err)
    }

    return nil
}

// listPlugins 列出所有插件
func listPlugins() error {
    // 获取可执行文件所在目录
    exeDir := filepath.Dir(os.Args[0])
    pluginsDir := filepath.Join(exeDir, "plugins")

    // 检查插件目录是否存在
    if _, err := os.Stat(pluginsDir); os.IsNotExist(err) {
        fmt.Println("No plugins directory found")
        return nil
    }

    // 读取插件目录
    entries, err := os.ReadDir(pluginsDir)
    if err != nil {
        return fmt.Errorf("failed to read plugins directory: %v", err)
    }

    fmt.Println("Installed plugins:")
    for _, entry := range entries {
        if entry.IsDir() {
            continue
        }

        // 只显示.x文件
        if filepath.Ext(entry.Name()) == ".x" {
            info, _ := entry.Info()
            fmt.Printf("- %s (size: %d bytes)\n", entry.Name(), info.Size())
        }
    }

    return nil
}

// extractPlugins 模拟插件提取功能
func extractPlugins(pluginPath string) error {
    fmt.Printf("Extracting plugins to: %s\n", pluginPath)

    // 创建插件目录
    if err := os.MkdirAll(pluginPath, os.ModePerm); err != nil {
        return fmt.Errorf("failed to create plugin directory: %v", err)
    }

    // 在实际应用中，这里会从嵌入的资源中提取插件
    // 但在简化版中，我们只是确保目录存在
    fmt.Println("Plugin extraction complete")
    return nil
}
